
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
/**
 *
 * @author Paolo
 */
public class Stub implements Runnable {

    ServerComunication proc1, proc2, prox;
    ComunicationUniCast nodo;
    private int inicio;
    String aux, aux1, aux2;

    public Stub(int porta1, int porta2, int porta3, int porta4, int inicio) {
        System.out.println("----- Iniciar o Stub -----");
        proc1 = new ServerComunication(null, porta1);
        proc2 = new ServerComunication(null, porta2);
        prox = new ServerComunication(null, porta3);
        nodo = new ComunicationUniCast(null, porta4, "localhost");

        this.inicio = inicio;
        System.out.println("Stub:Iniciando Servers");
        new Thread(proc1).start();
        new Thread(proc2).start();
        new Thread(prox).start();
        System.out.println("Stub:Iniciando Comunicação com o nodo");
        new Thread(nodo).start();
    }

    public void run() {

            if (inicio == 0) {
                try {
                    Thread.sleep(1000);
                    aux = prox.recebe();
                } catch (InterruptedException ex) {
                    aux = "Problema no recebimento pelo stub.";
                } catch (IOException ex) {
                    aux = "Problema no recebimento pelo stub.";
                }
                System.out.println("Stub (Nodo -> Prox): " + aux);
                inicio = 1;
                System.out.println("Stub : Fim da Rodada");

            } else {
                try {
                    Thread.sleep(1000);
                    nodo.envia("nodo:TOKEN:1"); //envia o token para o distribuidor
                    System.out.println("Stub (Prox -> Nodo): Mandei a mensagem: nodo:TOKEN:1");
                    aux1 = proc1.recebe();
                    System.out.println("Stub (Nodo -> Proc1): recebeu a mensagem: " + aux1);
                    aux2 = proc2.recebe();
                    System.out.println("Stub (Nodo -> Proc2): recebeu a mensagem: " + aux2);
                    String[] split1 = aux1.split(":");
                    aux1 = split1[0]+":"+split1[1]+":"+(Integer.parseInt(split1[2])+1)+":"+split1[3]+1;
                    proc1.envia(aux1);
                    System.out.println("Stub (Proc1 -> Nodo): envia a mensagem: " + aux1);
                    String[] split2 = aux2.split(":");
                    aux2 = split2[0]+":"+split2[1]+":"+(Integer.parseInt(split2[2])+1)+":"+split2[3];
                    proc2.envia(aux2);
                    System.out.println("Stub (Proc2 -> Nodo): envia a mensagem: " + aux2);

                    System.out.println("Stub : Fim da Rodada 1");
                    Thread.sleep(1000);
                      nodo.envia("nodo:TOKEN:2"); //envia o token para o distribuidor
                    System.out.println("Stub (Prox -> Nodo): Mandei a mensagem: nodo:TOKEN:2");
                    aux1 = proc1.recebe();
                    System.out.println("Stub (Nodo -> Proc1): recebeu a mensagem: " + aux1);
                    aux2 = proc2.recebe();
                    System.out.println("Stub (Nodo -> Proc2): recebeu a mensagem: " + aux2);
                    split1 = aux1.split(":");
                    aux1 = split1[0]+":"+split1[1]+":"+(Integer.parseInt(split1[2])+1)+":"+split1[3];
                    proc1.envia(aux1);
                    System.out.println("Stub (Proc1 -> Nodo): envia a mensagem: " + aux1);
                    split2 = aux2.split(":");
                    aux2 = split2[0]+":"+split2[1]+":"+(Integer.parseInt(split2[2])+1)+":"+split2[3];
                    proc2.envia(aux2);
                    System.out.println("Stub (Proc2 -> Nodo): envia a mensagem: " + aux2);

                    System.out.println("Stub : Fim da Rodada 2");
                    Thread.sleep(1000);

                    nodo.envia("nodo:TOKEN:3"); //envia o token para o distribuidor
                    System.out.println("Stub (Prox -> Nodo): Mandei a mensagem: nodo:TOKEN:3");
                    aux1 = proc1.recebe();
                    System.out.println("Stub (Nodo -> Proc1): recebeu a mensagem: " + aux1);
                    aux2 = proc2.recebe();
                    System.out.println("Stub (Nodo -> Proc2): recebeu a mensagem: " + aux2);
                    split1 = aux1.split(":");
                    aux1 = split1[0]+":"+split1[1]+":"+(Integer.parseInt(split1[2])+1)+":"+split1[3];
                    proc1.envia(aux1);
                    System.out.println("Stub (Proc1 -> Nodo): envia a mensagem: " + aux1);
                    split2 = aux2.split(":");
                    aux2 = split2[0]+":"+split2[1]+":"+(Integer.parseInt(split2[2])+1)+":"+split2[3];
                    proc2.envia(aux2);
                    System.out.println("Stub (Proc2 -> Nodo): envia a mensagem: " + aux2);

                    System.out.println("Stub : Fim da Rodada 3");
                    Thread.sleep(1000);

                    nodo.envia("nodo:TOKEN:4"); //envia o token para o distribuidor
                    System.out.println("Stub (Prox -> Nodo): Mandei a mensagem: nodo:TOKEN:4");
                    aux1 = proc1.recebe();
                    System.out.println("Stub (Nodo -> Proc1): recebeu a mensagem: " + aux1);
                    aux2 = proc2.recebe();
                    System.out.println("Stub (Nodo -> Proc2): recebeu a mensagem: " + aux2);
                    split1 = aux1.split(":");
                    aux1 = split1[0]+":"+split1[1]+":"+(Integer.parseInt(split1[2])+1)+":"+split1[3];
                    proc1.envia(aux1);
                    System.out.println("Stub (Proc1 -> Nodo): envia a mensagem: " + aux1);
                    split2 = aux2.split(":");
                    aux2 = split2[0]+":"+split2[1]+":"+(Integer.parseInt(split2[2])+1)+":"+split2[3];
                    proc2.envia(aux2);
                    System.out.println("Stub (Proc2 -> Nodo): envia a mensagem: " + aux2);

                    System.out.println("Stub : Fim da Rodada 4");
                    Thread.sleep(1000);

                } catch (IOException ex) {
                    Logger.getLogger(Stub.class.getName()).log(Level.SEVERE, null, ex);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Stub.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

    }
}
